home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / PowerFantasm™ 4.05 / Beginners guide / EDIT EXAMPLE / EDIT_EXAMPLE.S < prev    next >
Encoding:
Text File  |  1996-06-21  |  17.9 KB  |  641 lines  |  [TEXT/edF6]

  1. ***********************************************************************************
  2. *SIMPLE EDITOR                                  *
  3. *This example application is designed to be used with the beginners guide to Mac  *
  4. *machine code chapter 4.                                                          *
  5. *The code is broken into sections that relate to chapter 4.                       *
  6. *WRITTEN BY STUART BALL JULY 94                                                   *
  7. ***********************************************************************************
  8.  
  9. ***********************SECTION 1***************************************************
  10.     INCLUDE     EDIT_EXAMPLE_EQUS    INCLUDE OUR EQUATES
  11. EDIT_EXAMPLE:    
  12. **INIT MAC**
  13.     LEA    QDGLOB,A0    QUICKDRAW WORK SPACE
  14.     LEA    202(A0),A0
  15.     MOVE.L    A0,-(SP)    QDGLOB(202)
  16.     DC.W    INITGRAF    INIT GRAPHICS
  17.     DC.W    INITFONTS
  18.     MOVEQ    #-1,D0
  19.     DC.W    FLUSHEVENTS
  20.     DC.W    INITWINDOWS
  21.     DC.W    INITMENUS
  22.     CLR.L    -(SP)
  23.     DC.W    INITDIALOGS
  24.     DC.W    TEINIT    INIT TEXT EDITOR
  25.     DC.W    INITCURSOR
  26. **END OF MAC INIT**
  27.  
  28. *********************SECTION 2*****************************************************
  29.     MOVEM.L    A5-A6,-(SP)    SAVE MAC WORLD
  30.     LEA    VARS,A6    A6 IS OUR VARIABLES
  31.     BSR    MAKERESMENU    GET MENU FROM RESOURCE FORK AND DRAW THEM
  32.  
  33.     BSR    CLEAR_PB    CLEAR PARAMETER BLOCK FOR FILE IO
  34.     CLR.W    VOLPTR(A6)    EDITOR VOLUME POINTER
  35.  
  36.     LEA    NO_W_TITLE,A0    DRAW WINDOW WITH DEFAULT TITLE
  37.     BSR    DRAW_WINDOW
  38.     
  39. ********************SECTION 3*******************************************************
  40. MAIN_LOOP:    BSR    EVENTS    MAIN LOOP STARTS HERE
  41.     TST.W    D0    EVENTS RETURNS -1 IF QUIT ELSE 0
  42.     BEQ.S    MAIN_LOOP    END HERE WITH SHORT BRANCH
  43.  
  44. ********************SECTION 4*******************************************************
  45. TERMINATE:    BSR    SHUTWINDOW    CLOSE WINDOW
  46.     MOVEM.L    (SP)+,A5-A6    RESTORE REGS
  47.     RTS        BYEEEEEEEEEE
  48. ***************************FRAME ROUTINES******************************************
  49.  
  50. *******************SECTION 5*******************************************************
  51. EVENTS:    DC.W    SYSTEMTASK    LET THE MAC GET AN EYE IN
  52.     TST.L    TEHND(A6)    TEXT EDITOR HANDLE
  53.     BEQ    NO_EDITOR    IF ZERO NO WINDOW OPEN
  54.     MOVE.L    TEHND(A6),-(SP)
  55.     DC.W    TEIDLE    
  56. NO_EDITOR:    CLR.B    -(SP)    TRAP RETURNS A BYTE
  57.     MOVE.W    #$FFFF,-(SP)    RETURN ANY EVENT
  58.     PEA    SEVENTREC(PC),-(SP)    EVENT BUFFER ON STACK AS PARAM
  59.     DC.W    GETNEXTEVENT
  60.     MOVE.B    (SP)+,D0    THE EVENT IN D0
  61.     EXT.W    D0
  62.     EXT.L    D0
  63.     TST.L    D0
  64.     BEQ    END_EVENTS    NOTHING HAPPENED
  65. **1ST WORD OF SEVENTREC=EVENT
  66.     LEA    SEVENTREC,A0    EVENT BUFFER
  67.     MOVE.W    (A0),D0    THE EVENT IN D0
  68.     CMPI.W    #1,D0    IF ITS 1 THEN D0 MOUSE PROCESSING
  69.     BNE.S    NOT_MOUSE
  70.     BSR    DO_MOUSE
  71.     RTS
  72.  
  73. *******************SECTION 5A******************************************************
  74. NOT_MOUSE:    CMPI.W    #3,D0    IF ITS 3 OR 5 THEN ITS A KEY PRESS
  75.     BNE.S    NOT_KEY
  76.     BSR    KEYDOWN
  77.     RTS
  78. NOT_KEY:    CMPI.W    #5,D0
  79.     BNE.S    NOT_KEY_OTHER
  80.     BSR    KEYDOWN
  81.     RTS
  82. NOT_KEY_OTHER:    CMPI.W    #6,D0    IF ITS 6, THEN WE NEED TO UPDATE OUR WINDOW
  83.     BNE.S    NOT_UPDATE
  84.     BSR    UPDATE
  85.     MOVEQ    #0,D0
  86.     RTS        
  87. NOT_UPDATE:    CMPI.W    #8,D0    IF ITS 8, WE NEED TO ACTIVATE OUR WINDOW
  88.     BNE.S    END_EVENTS
  89.     BSR    ACTIVATE
  90. END_EVENTS:    MOVEQ    #0,D0
  91.     RTS
  92.  
  93. ******************************KEYDOWN***********************************************
  94. *****************SECTION 5B*********************************************************
  95. KEYDOWN:    LEA    SEVENTREC,A0
  96.     MOVE.W    14(A0),D1    MODIFIERS (NORMAL KEY OR MENU CLICK)
  97.     CLR.L    D0
  98.     MOVE.B    5(A0),D0    THE KEY THAT WAS PRESSED
  99.     ANDI.W    #256,D1
  100.     BEQ.S    NORMAL_KEY    KEYBOARD KEY
  101. **HERE ITS A MENU CLICK
  102.  
  103.     CLR.L    -(SP)    MENUKEY RETURNS A LONG
  104.     EXT.W    D0    
  105.     MOVE.W    D0,-(SP)    THE KEY
  106.     DC.W    MENUKEY    GET MENU SELECTION
  107.     MOVE.L    (SP)+,D0    IN D0
  108.     BSR    DO_MENU    PROCESS MENU SELECTION (IN MENUS.S)
  109.     RTS
  110.     
  111. *******************SECTION 5C******************************************************
  112. NORMAL_KEY:    BSR    PUTACHAR    PRINT THE CHARACTER
  113.     MOVE.W    #1,DIRTY(A6)    SET DIRTY FLAG - THE FILE IS MODIFIED 
  114.     MOVE.L    TEHND(A6),A0    GET TEXT EDITOR HANDLE
  115.     MOVE.L    (A0),A0    POINT TO TERECORD
  116. **CHECK FOR VERY ROUGH SCROLLING
  117.     MOVE.W    16(A0),D0    GET CURSOR LINE NUMBER
  118.     CMPI.W    #5,D0    
  119.     BGT    NOT_OFF_TOP    IF THE CURSOR Y IS > 5 ITS NOT OFF TOP
  120. **HERE CURSOR HAS GONE OFF THE TOP OF THE WINDOW - WE NEED SCROLL THE WINDOW DOWN
  121.     MOVE.L    SCROLLHND(A6),-(SP)    SCROLL BAR HANDLE
  122.     MOVE.L    CURTOP(A6),D1    THE LAST TOP POSITION
  123.     SUBI.L    #PAGELINES-1,D1    MINUS THE NUMBER OF LINES PER PAGE
  124.     MOVE.W    D1,-(SP)    ONTO STACK
  125.     DC.W    SETCTLVALUE    SET THE SCROLL BAR VALUE
  126.     BSR    SCROLL    SCROLL WINDOW
  127.     BRA    CURSOR_ON_PAGE
  128. **CHECK IF THE CURSOR HAS GONE OFF THE BOTTOM OF THE WINDOW
  129. NOT_OFF_TOP:    CMPI.W    #379,D0
  130.     BLE    CURSOR_ON_PAGE    NO IT HASNT
  131.  
  132. **CURSOR OFF BOTTOM OF WINDOW
  133.     MOVE.L    SCROLLHND(A6),-(SP)
  134.     MOVE.L    CURTOP(A6),D1
  135.     ADDI.L    #PAGELINES-1,D1
  136.     MOVE.W    D1,-(SP)
  137.     DC.W    SETCTLVALUE    FLICK DOWN ONE PAGE
  138.     BSR    SCROLL
  139.     
  140. **NOW LET SCROLL BAR KNOW HOW MANY LINES THERE ARE
  141. CURSOR_ON_PAGE:    MOVE.L    SCROLLHND(A6),-(SP)
  142.     MOVE.W    NUMBLINES(A6),-(SP)
  143.     DC.W    SETCTLMAX    SET SCROLL BAR MAX NUMBER OF LINES
  144.     CLR.L    D0    RETURN 0
  145.     RTS
  146.  
  147. ********************SECTION 6*******************************************************    
  148. *****************************UPDATE****************************************************
  149. UPDATE:    MOVE.L    WINDPTR(A6),-(SP)    WINDOW HANDLE
  150.     DC.W    SETPORT    TELL MAC THIS IS THE WINDOW
  151.     MOVE.L    WINDPTR(A6),-(SP)
  152.     DC.W    BEGINUPDATE
  153.     PEA    VIEWRECT,-(SP)
  154.     MOVE.L    TEHND(A6),-(SP)
  155.     DC.W    TEUPDATE
  156.     MOVE.L    WINDPTR(A6),-(SP)
  157.     DC.W    DRAWCONTROLS
  158.     MOVE.L    WINDPTR(A6),-(SP)
  159.     DC.W    ENDUPDATE
  160.     CLR.L    D0    RETURN 0
  161.     RTS
  162.     
  163. *******************SECTION 7***********************************************************
  164. ***********************************ACTIVATE WINDOW*************************************
  165. ACTIVATE:    LEA    SEVENTREC,A0
  166.     MOVE.W    14(A0),D0    
  167.     ANDI.W    #1,D0    WAS THE CLICK IN OUR WINDOW?
  168.     TST.W     D0
  169.     BEQ    NOT_ACTIVE    NO
  170. **WE'VE CLICKED IN OUR WINDOW
  171.     MOVE.L    TEHND(A6),-(SP)    YES
  172.     DC.W    TEACTIVATE
  173.     RTS
  174. NOT_ACTIVE:    MOVE.L    TEHND(A6),-(SP)
  175.     DC.W    TEDEACTIVATE
  176.     RTS
  177.  
  178. *******************SECTION 8************************************************************     
  179. *************************************DRAWWINDOW*****************************************    
  180.     
  181. **DRAW WINDOW NEEDS THE WINDOW TITLE IN A0            
  182. DRAW_WINDOW:    CLR.W    DIRTY(A6)    CLEAR DIRTY FLAG
  183.     LEA    PTITLE,A1
  184.     BSR    C_TO_P_STR    CONVERT A0 TO PASCAL STRING IN A1
  185. **SETRECT BOUNDRECT,STARTX,STARTY,ENDX,ENDY
  186.     PEA    BOUNDRECT    ARRAY FOR SETRECT
  187.     MOVE.W    #5,-(SP)    RECTANGLE COORDS X1,Y1,X2,Y2
  188.     MOVE.W    #45,-(SP)
  189.     MOVE.W    #639,-(SP)
  190.     MOVE.W    #437,-(SP)
  191.     DC.W    SETRECT    THE OVERALL WINDOW RECTANGLE
  192. **NEWWINDOW
  193.     CLR.L    -(SP)
  194.     CLR.L    -(SP)
  195.     PEA    BOUNDRECT    WINDOW COORDS
  196.     PEA    PTITLE    WINDOW TITLE
  197.     MOVE.B    #1,-(SP)    NECESSARY PARAMETERS
  198.     MOVE.W    #4,-(SP)
  199.     MOVE.L    #-1,-(SP)
  200.     MOVE.B    #0,-(SP)
  201.     MOVE.L    #0,-(SP)
  202.     DC.W    NEWWINDOW    CREATE A NEW WINDOW
  203.     MOVE.L    (SP)+,WINDPTR(A6)    SAVE WINDOW HANDLE
  204.     MOVE.L    WINDPTR(A6),-(SP)
  205.     DC.W    SETPORT    TELL MAC TOWORK WITH THIS WINDOW
  206.     
  207.     MOVE.W    #4,-(SP)
  208.     DC.W    TEXTFONT    SET FONT TO MONACO
  209.     MOVE.W    #9,-(SP)    
  210.     DC.W    TEXTSIZE    SET 9 POINT SIZE
  211.     
  212.     PEA     VIEWRECT
  213.     MOVE.W    #4,-(SP)
  214.     MOVE.W    #5,-(SP)
  215.     MOVE.W    #614,-(SP)
  216.     MOVE.W    #437,-(SP)
  217.     DC.W    SETRECT    THE VISIBLE WORKING AREA OF THE WINDOW
  218.     
  219.     CLR.L    -(SP)
  220.     PEA    VIEWRECT
  221.     PEA    VIEWRECT
  222.     DC.W    TENEW    START NEW TEXT EDITOR
  223.     MOVE.L    (SP)+,TEHND(A6)    GET TE HANDLE
  224.     CLR.L    LINE_POS(A6)
  225.     CLR.L    CURTOP(A6)
  226. **NOW DRAW VERTICAL SCROLL BAR
  227.     PEA     BOUNDRECT
  228.     MOVE.W    #619,-(SP)
  229.     MOVE.W    #0,-(SP)
  230.     MOVE.W    #635,-(SP)
  231.     MOVE.W    #392,-(SP)    COORDS OF SCROLL BAR
  232.     DC.W    SETRECT
  233. **NOW GET THE SCROLL HANDLE
  234.     CLR.L    -(A7)
  235.     MOVE.L    WINDPTR(A6),-(A7)
  236.     PEA    BOUNDRECT
  237.     PEA    NULL_STRING
  238.     MOVE.B    #1,-(SP)
  239.     MOVE.W    #0,-(SP)
  240.     MOVE.W    #0,-(SP)
  241.     MOVE.W    #0,-(SP)
  242.     MOVE.W     #16,-(SP)
  243.     MOVE.L    #0,-(SP)
  244.     DC.W    NEWCONTROL
  245.     MOVE.L    (SP)+,SCROLLHND(A6)    SCROLL BAR HANDLE
  246.     RTS
  247.     
  248. SHUTWINDOW:    MOVE.L    TEHND(A6),-(SP)
  249.     DC.W    TEDISPOSE    CLEAR DOWN TEXT EDITOR
  250.     MOVE.L    WINDPTR(A6),-(SP)
  251.     DC.W    DISPOSEWINDOW    CLOSE OUR WINDOW
  252.     CLR.L    WINDPTR(A6)    CLEAR OUR HANDLES
  253.     CLR.L    SCROLLHND(A6)
  254.     CLR.L    TEHND(A6)
  255.     RTS
  256.  
  257. *******************SECTION 9************************************************************    
  258. **DO_ALERT NEEDS RES ID IN D0 AND RETURNS NUMBER OF BUTTON CLICKED IN D0 
  259. DO_ALERT:    CLR.W    -(SP)
  260.     MOVE.W    D0,-(SP)    RES ID OF ALERT
  261.     CLR.L    -(SP)
  262.     DC.W    ALERT    DO ALERT
  263.     MOVE.W    (SP)+,D0    GET RESULT
  264.     RTS
  265.  
  266. *******************SECTION 10*******************************************************
  267. *********************************DO MOUSE*******************************************
  268. DO_MOUSE:    LEA    SEVENTREC,A0
  269.     MOVE.L    10(A0),D7    WHERE THE MOUSE IS
  270.     CLR.W    -(SP)
  271.     MOVE.L    D7,-(SP)
  272.     PEA    WWINDOWPTR
  273.     DC.W    FINDWINDOW
  274.     MOVE.W    (SP)+,D1    WINDOW LOCATION
  275.     CMPI.W    #1,D1    IF 1, IN MENU BAR
  276.     BNE.S    NOT_MENUBAR
  277.     CLR.L    -(SP)
  278.     MOVE.L    D7,-(SP)    MOUSE COORDS
  279.     DC.W    MENUSELECT    GET MENU SELECTION
  280.     MOVE.L    (SP)+,D0
  281.     BSR    DO_MENU    ACT ON IT
  282.     RTS
  283.     
  284. NOT_MENUBAR:    CMPI.W    #3,D1
  285.     BNE    NOT_WINDOW
  286.     MOVE.L    D7,MOUSE_GLBTOLOC    SAVE MOUSE COORDS
  287.     LEA    MOUSE_GLBTOLOC,A0
  288.     MOVE.L    A0,-(SP)
  289.     DC.W    GLOBALTOLOCAL    MAKE MOUSE COORDS RELATIVE TO WINDOW
  290.     CLR.W    -(SP)
  291.     MOVE.L    (A0),-(SP)    MOUSE COORDS(LOCAL)
  292.     MOVE.L    WINDPTR(A6),-(SP)
  293.     LEA    WCTLHAND,A4
  294.     MOVE.L    A4,-(SP)
  295.     DC.W    FINDCONTROL    SEE IF WE'VE CLICKED ON A SCROLLBAR CONTROL
  296.     MOVE.W    (SP)+,D0    IN D0 NOW
  297.     EXT.L    D0
  298.     TST.L    D0
  299.     BNE    NOT_SELECT    IF ZERO, WE'VE SELECTED TEXT
  300.     LEA    MOUSE_GLBTOLOC,A0
  301.     MOVE.L    (A0),D0
  302.     BSR    SELECTTEXT    HILIGHT THE TEXT
  303.     BRA    NOT_WINDOW    BYE
  304. NOT_SELECT:    CMPI.W    #20,D0
  305.     BNE.S    NOT_UP_BUTT    UP BUTTON IN SCROLL BAR?
  306.     MOVEQ    #-1,D1    YEP, SET LINES TO SCROLL IN D1
  307.     BSR    DO_SCROLL    SCROLL IT
  308.     BRA    NOT_WINDOW    CHOW
  309. NOT_UP_BUTT:    CMPI.W    #21,D0
  310.     BNE.S    NOT_DOWN_BUTT    DOWN BUTTON?
  311.     MOVEQ    #1,D1    YUP, SET LINES TO SCROLL
  312.     BSR    DO_SCROLL    SCROLL IN OTHER DIRECTION
  313.     BRA    NOT_WINDOW    ASTA LA VIS....
  314. NOT_DOWN_BUTT:    CMPI.W    #22,D0
  315.     BNE.S    NOT_UP_PAGE    UP A PAGE?
  316.     SUB.L    #PAGELINES,LINE_POS(A6)
  317.     MOVE.L    #-PAGELINES,D1    YES, SET LINES TO SCROLL
  318.     BSR    DO_SCROLL
  319.     MOVE.L    LINE_POS(A6),D0
  320.     BSR    SELECTTEXT    POSITION CURSOR
  321.     BRA    NOT_WINDOW    CIAN.......
  322. NOT_UP_PAGE:    CMPI.W    #23,D0
  323.     BNE.S    NOT_PAGE_DOWN    PAGE DOWN?
  324.     ADD.L    #PAGELINES,LINE_POS(A6)
  325.     MOVE.L    #PAGELINES,D1    SCROLL DOWN THIS MANY LINES
  326.     BSR    DO_SCROLL
  327.     MOVE.L    LINE_POS(A6),D0
  328.     BSR    SELECTTEXT    POSITION CURSOR
  329.     BRA    NOT_WINDOW    BYE
  330. NOT_PAGE_DOWN:    CMPI.W    #129,D0    SCROLL GADGET?
  331.     BNE    NOT_WINDOW    NOPE
  332.     CLR.W    -(SP)
  333.     MOVE.L    SCROLLHND(A6),-(SP)
  334.     LEA    MOUSE_GLBTOLOC,A0
  335.     MOVE.L    (A0),-(SP)    MOUSE LOCAL COORDS
  336.     CLR.L    -(SP)
  337.     DC.W    TRACKCONTROL    TRACK THE SCROLL GADGET (WHAT IS IT CALLED?)
  338.     MOVE.W    (A7)+,D0
  339.     CMPI.W    #129,D0
  340.     BNE    NOT_WINDOW
  341.     BSR    SCROLL    SCROLL TEXT ACCORDINGLY
  342. NOT_WINDOW:    CLR.L    D0    RETURN NO ERROR
  343.     RTS        AU REVOIR
  344.     
  345. WWINDOWPTR:    DS.L    1    WORKING AREA FOR FINDWINDOW
  346. WCTLHAND:    DS.L    1
  347. MOUSE_GLBTOLOC:    DS.L    1    MOUSE LOCAL COORDS
  348.  
  349. *********************SECTION 11**************************************************
  350. **************************UTILITY ROUTINES*****************************************
  351.  
  352. **OPENSELECTOR PUTS UP A MAC FILE SELECTOR AND RETURNS FILENAME IN A0 AS C STRING
  353. **NEEDS ADDRESS OF BUFFER IN A0 (WHERE WE WANT THE FILE NAME TO GO)
  354. OPENSELECTOR:    LINK    A4,#-74        WORKING SPACE ON STACK
  355.     MOVE.L    #$00800080,-(SP)    X/Y COORDS OF DIALOG
  356.     CLR.L    -(SP)
  357.     CLR.L    -(SP)
  358.     MOVE.W    #1,-(SP)
  359.     PEA    TYPE_STRING,-(SP)    THE TYPE OF FILE (TEXT)
  360.     CLR.L    -(SP)
  361.     MOVE.L    A0,LOCAL_F_NAME        ADDRESS OF WHERE THE NAME IS TO GO
  362.     MOVE.L    A0,-(SP)
  363.     MOVE.W    #2,-(SP)
  364.     DC.W    PACK3    SELECTOR
  365. **NOW COPY FILENAME AND CONVERT TO C
  366.     MOVE.L    LOCAL_F_NAME,A0
  367.     CLR.L    D0
  368.     CLR.L    D1
  369.     TST.B    (A0)    IF FIRST BYTE OF NAME IS 0
  370.     BEQ    CANCELLED    THEN WE CLICKED CANCEL
  371.     MOVE.W    6(A0),D0    VOLREF
  372. **CONVERT FROM PASCAL STRING TO C STRING
  373.     LEA    10(A0),A1    ACTUAL PASCAL STRING HERE
  374.     MOVE.B    (A1)+,D1    LENGTH OF STRING IN D1
  375.     BRA.S    DO_COPY_LOOP
  376. COPLOOP:    MOVE.B    (A1)+,(A0)+    COPY FILENAME TO WHERE WE WANT IT
  377. DO_COPY_LOOP:    DBRA    D1,COPLOOP
  378.     CLR.B    (A0)+    CLEAR LAST BYTE OF STRING
  379.     MOVE.L    LOCAL_F_NAME,A0    RETURN ADDRESS OF NAME IN A0
  380.     UNLK    A4
  381.     RTS
  382. CANCELLED:    CLR.L    D0    NO VOLREF
  383.     UNLK    A4
  384.     RTS
  385. TYPE_STRING:    DC.B    "TEXT",0
  386.     EVEN
  387. LOCAL_F_NAME:    DS.L    1
  388. LOCAL_PSTRING:    DS.L    1
  389.  
  390. **PUT UP A WRITE SELECTOR BOX
  391. **OPEN_WRITE NEEDS FILENAME IN A0 AND INFO STRING(SAVE THE FILE AS...) IN A1
  392. **ALSO VOLPTR IN D0
  393. **RETURNS FILENAME IN A0 AND VOLREF IN D0. IF CANCELLED D0=0
  394. WRITE_SELECT:    MOVE.L    A0,LOCAL_F_NAME
  395.     MOVE.L    A1,LOCAL_PSTRING
  396.     LEA    BUFFER,A2    100 BYTE BUFFER
  397.     MOVE.W    D0,6(A2)
  398.     LEA    10(A2),A1    POINT OT WHERE THE FILENAME NEEDS TO GO
  399.     MOVE.L    A0,-(SP)
  400.     MOVE.L    A1,-(SP)
  401.     BSR    CTOPSTR    CONVERT FILENAME TO PASCAL
  402.     ADDQ.L    #8,SP    
  403.     
  404.     LEA    PTEXTBUFFER,A1
  405.     MOVE.L    LOCAL_PSTRING,A0
  406.     MOVE.L    A0,-(SP)
  407.     MOVE.L    A1,-(SP)
  408.     BSR    CTOPSTR    CONVERT INFO STRING TO PASCAL
  409.     ADDQ.L    #8,SP
  410.     LEA    BUFFER,A0
  411.     MOVE.L    #$00800080,-(SP)    COORDS OF DIALOG
  412.     PEA    PTEXTBUFFER    INFO STRING
  413.     LEA    10(A0),A0
  414.     MOVE.L    A0,-(SP)    FILENAME PASCAL FORMAT
  415.     PEA    0
  416.     PEA    BUFFER    WORKING BUFFER
  417.     MOVE.W    #1,-(SP)
  418.     DC.W    PACK3    WRITE SELECTOR
  419.     LEA    BUFFER,A0
  420.     TST.B    (A0)
  421.     BNE    WRITE_SEL_OK
  422.     CLR.L    D0    USER CANCELLED
  423.     RTS        BYE
  424.     
  425. WRITE_SEL_OK:    LEA    10(A0),A0
  426.     MOVE.L    LOCAL_F_NAME,A1    GET FILENAME
  427.     MOVE.L    A0,-(SP)    PASCAL STRING
  428.     MOVE.L    A1,-(SP)    WHERE WE WANT THE C STRING TO GO
  429.     BSR    PTOCSTR    CONVERT PASCAL STRING TO C STRING
  430.     ADDQ.L    #8,SP    CORRECT STACK
  431.     LEA    BUFFER,A0
  432.     CLR.L    D0
  433.     MOVE.W    6(A0),D0    GET VOLPTR
  434.     RTS
  435.     
  436. BUFFER:    DS.B    100
  437. PTEXTBUFFER:    DS.B    100
  438.     EVEN    
  439. **************************************************************************************
  440. **CONVERT A C STRING TO PASCAL STRING
  441. **NEEDS C STRING IN A0
  442. **AND ADDRESS OF WHERE TO PUT THE PASCAL STRING IN A1
  443. **C STRING FORMAT = HELLO,0
  444. **PASCAL STRING FORMAT = 5,HELLO 
  445. C_TO_P_STR:    CLR.L    D0
  446. DO_P_LOOP:    MOVE.B    (A0)+,D1    GET CHARACTER
  447.     BEQ.S    CTOPEND    NULL STRING
  448.     ADDQ.L    #1,D0    COUNT CHARACTERS        
  449.     MOVE.B    D1,0(A1,D0.L)    SAVE CHARACTER IN P STRING
  450.     BRA.S    DO_P_LOOP
  451. CTOPEND:    MOVE.B    D0,(A1)    PUT NUMNBER OF CHARS AT START OF STRING
  452.     RTS
  453.  
  454. **PUTACHAR PRINT THE CHARACTER IN THE LOW BYTE OF D0 USING TEKEY
  455. PUTACHAR:    ANDI.W    #$FF,D0
  456.     MOVE.W    D0,-(SP)
  457.     MOVE.L    TEHND(A6),-(SP)
  458.     DC.W    TEKEY
  459.     BSR.S    SETSCROLLMAX    UPDATE SCROLL BAR
  460.     RTS
  461.     
  462. **SETSCROLLMAX TELLS THE SCROLL BAR HOW MANY LINES THERE ARE
  463. SETSCROLLMAX:    TST.L    TEHND(A6)    TE ACTIVE?
  464.     BNE.S    SCROLL_BAR_OK    YES
  465.     RTS        NO
  466. SCROLL_BAR_OK:    MOVE.L    TEHND(A6),A0
  467.     MOVE.L    (A0),A0    TERECORD
  468.     CLR.L    D0
  469.     MOVE.W    94(A0),D0    NUMBER OF LINES IN EDITOR
  470.     SUB.W    #PAGELINES,D0    MINUS 1 PAGE
  471.     BMI.S    NOT_A_PAGE    IF < 0, THEN WE CANT SCROLL
  472.     MOVE.W    D0,NUMBLINES(A6)    UPDATE
  473.     MOVE.L    SCROLLHND(A6),-(SP)
  474.     MOVE.W    D0,-(SP)
  475.     DC.W    SETCTLMAX    UPDATE SCROLL BAR
  476. NOT_A_PAGE:    CLR.L    D0
  477.     RTS
  478.  
  479. *******************SECTION 12*******************************************************    
  480. **DO_SCROLL NEEDS WHICH PART IN D0 AND NUMBER OF LINES IN D1
  481. DO_SCROLL:    MOVE.L    D0,D6
  482.     MOVE.L    D1,D7
  483. WAIT_FOR_MOUSE:    CLR.B    -(SP)    SEE IF MOUSE STILL DOWN
  484.     DC.W    STILLDOWN
  485.     MOVE.B    (SP)+,D0
  486.     EXT.W     D0
  487.     TST.W    D0
  488.     BEQ    UNLIGHT    TURN OF CONTROL HIGHLIGHTED
  489.     
  490.     PEA    WHEREMOUSE    GET MOUSE COORDS HERE
  491.     DC.W    GETMOUSE
  492.     CLR.W    -(SP)
  493.     MOVE.L    SCROLLHND(A6),-(SP)
  494.     LEA    WHEREMOUSE,A0
  495.     MOVE.L    (A0),-(SP)    MOUSE COORDS
  496.     DC.W    TESTCONTROL
  497.     MOVE.W    (SP)+,D0
  498.     CMP.W    D0,D6
  499.     BNE    HILITE_OFF
  500.     MOVE.L    SCROLLHND(A6),-(SP)    HILITE THE PART
  501.     MOVE.W    D6,-(SP)    THE PART
  502.     DC.W    HILITECONTROL
  503.     MOVE.L    SCROLLHND(A6),-(SP)
  504.     MOVE.L    CURTOP(A6),D0
  505.     ADD.L    D7,D0    LINES TO SCROLL 
  506.     MOVE.W    D0,-(SP)
  507.     DC.W    SETCTLVALUE    SET SCROLL BAR VALUE
  508.     BSR    SCROLL    SCROLL WINDOW
  509.     BRA    WAIT_FOR_MOUSE    BUTTON STILL DOWN.
  510. HILITE_OFF:    MOVE.L    SCROLLHND(A6),-(SP)
  511.     CLR.W    -(SP)
  512.     DC.W    HILITECONTROL    UNLIGHT THE CONTROL
  513.     CLR.L    D1
  514.     BRA    WAIT_FOR_MOUSE
  515. UNLIGHT:    MOVE.L    SCROLLHND(A6),-(SP)
  516.     CLR.W    -(SP)
  517.     DC.W    HILITECONTROL    UNLIGHT ALL CONTROLS, JUST IN CASE
  518.     CLR.L    D0
  519.     RTS
  520.  
  521. WHEREMOUSE:    DS.L    1    FOR MOUSEY COORDS
  522.  
  523. ***SCROLL 
  524. SCROLL:    MOVEM.L    D6-D7,-(SP)
  525.     MOVE.L    CURTOP(A6),D7    GT CURRENT TOP LINE
  526.     CLR.W    -(SP)
  527.     MOVE.L    SCROLLHND(A6),-(SP)
  528.     DC.W    GETCTLVALUE    GET NEW TOP LINE
  529.     MOVE.W    (SP)+,D6    GET CURTOP
  530.     EXT.L    D6
  531.     MOVE.L    D6,CURTOP(A6)
  532.     SUB.L    D6,D7    OLDTOP-CURTOP
  533.     MULS    #11,D7    TIMES FONT HIEGHT
  534.     TST.L    D7
  535.     BEQ    NO_SCROLL    IF ZERO, DONT BOTHER SCROLLING
  536.     CLR.W    -(SP)
  537.     MOVE.W    D7,-(SP)
  538.     MOVE.L    TEHND(A6),-(SP)
  539.     DC.W    TESCROLL    SCROLL 
  540. NO_SCROLL:    MOVEM.L    (SP)+,D6-D7
  541.     CLR.L    D0
  542.     RTS
  543.  
  544. **SELECTEXT NEEDS WHERE IN D0        
  545. SELECTTEXT:    CLR.B    -(SP)
  546.     MOVE.L    D0,D6
  547.     MOVE.L    D0,-(SP)
  548.     PEA    VIEWRECT,-(SP)    CHECK MOUSE IS IN WINDOW!
  549.     DC.W    PTINRECT
  550.     MOVE.B    (SP)+,D1
  551.     TST.B    D1
  552.     BEQ.S    ST_END    NOPE
  553.     MOVE.L    D6,-(SP)
  554.     MOVE.B    #0,-(SP)
  555.     MOVE.L    TEHND(A6),-(SP)
  556.     DC.W    TECLICK    YES, HILITE TEXT
  557.     CLR.L    D0
  558. ST_END:    RTS
  559.  
  560. *********************SECTION 13*****************************************************
  561. ***ANOTHER WAY OF CONVERTING STRINGS, THIS TIME THE PARAMETERS ARE PASSED ON THE STACK
  562. CTOPSTR:    LINK    A6,#$0000
  563.     CLR.L    D0
  564.     MOVEA.L    $000C(A6),A0
  565.     MOVEA.L    $0008(A6),A1
  566. CTPLOOP:    MOVE.B    (A0)+,D1 
  567.     BEQ.S    CTP_DONE
  568.     ADDQ.L    #$1,D0
  569.     MOVE.B     D1,$00(A1,D0.L)
  570.     BRA.S    CTPLOOP       
  571. CTP_DONE:    MOVE.B    D0,(A1)
  572.     UNLK    A6
  573.     RTS
  574. **PASCAL TO C CONVERT - PARAMETERS ON STACK
  575. PTOCSTR:    LINK     A6,#$0000
  576.     CLR.L    D0
  577.     MOVEA.L    $000C(A6),A0
  578.     MOVEA.L    $0008(A6),A1
  579.     MOVE.B    (A0)+,D0 
  580.     BRA.S     PTCDO
  581. PTCLOOP:    MOVE.B    (A0)+,(A1)+ 
  582. PTCDO:    DBF    D0,PTCLOOP
  583.     CLR.B    (A1)
  584.     UNLK    A6
  585.     RTS
  586.  
  587. **SET_W_TITLE NEEDS TITLE IN A3 AS STRING
  588. **SETS WINDOW TITLE, WITHOUT REDRAWING THE WINDOW
  589. SET_W_TITLE:    LEA     NEW_FNAME(PC),A2    *PASCAL FILENAME BUILT HERE
  590.     MOVE.L    A3,-(A7)    *WINDOW TITLE IN A3 AS A C STRING
  591.     MOVE.L    A2,-(A7)    *WILL BE IN A2 AS A PASCAL STRING
  592.     BSR    CTOPSTR    *CONVERT TO PASCAL STRING
  593.     ADDQ.L    #8,A7
  594.     MOVE.L    WINDPTR(A6),-(SP)    *WINDOW HANDLE
  595.     PEA    NEW_FNAME(PC)    *TITLE AS PASCAL
  596.     DC.W    $A91A    SET WIN TITLE
  597.     RTS
  598.  
  599. ******************SECTION 14*******************************************************    
  600.     INCLUDE    FILE_IO.S
  601.     INCLUDE    MENUS.S
  602. **********************DATA FOLLOWS*************************************************
  603. NO_W_TITLE:    DC.B    "EXAMPLE EDITOR - no file.",0    DEFAULT WINDOW TITLE
  604.     EVEN
  605. NULL_STRING:    DC.B    0    PASCAL NULL STRING
  606.     EVEN
  607. WRITE_STRING:    DC.B    "Enter filename to save as.....",0
  608.     EVEN
  609.  
  610. *******************VARIABLES FOLLOW************************************************
  611.  
  612. **PROGRAM GLOBALS
  613. SEVENTREC:    DS.B     16    *SCREEN EVENT RECORD
  614. VIEWRECT:    DS.B    8    *VIEW RECTANGLE
  615. BOUNDRECT:    DS.B    8
  616. PBLOCK:    DS.B    100    *PARAM BLOCK FOR I/O
  617. FILENAME:    DS.B    64    *FILENAME AS C STRING
  618. PFILENAME:    DS.B    64    *FILENAME AS PASCAL STRING
  619. TITLE:    DS.B    100    *WINDOW TITLE STRING
  620. PTITLE:    DS.B    100    *CONVERTED TO PASCAL
  621. QDGLOB:    DS.B    206    *QUICKDRAW ARRAY
  622. ****OFFSETS FROM A6
  623.  
  624. SCRATCH_1:    EQU    0    *.L SCRATCH VARIABLES
  625. SCRATCH_2:    EQU    4
  626. WINDPTR:    EQU     8    *.L WINDOW HANDLE
  627. TEHND:    EQU     12    *.L TEXT EDITOR HANDLE
  628. SCROLLHND:    EQU     16    *.L SCROLL BAR HANDLE
  629. VOLPTR:    EQU    20    *.W FILE POINTER
  630. NUMBLINES:    EQU    22    *.W NUMBER OF LINES IN TE
  631. LINE_POS:    EQU    26    *.L CURRENT LINE POSITION
  632. APPLEMENU:    EQU    30    *.L HANDLE OF APPLE MENU
  633. FILEMENU:    EQU    34    *.L
  634. EDITMENU:    EQU    38    *.L
  635. CURTOP:    EQU    42    *.L TOP OF WINDOW
  636. DIRTY:    EQU    46    *.W FILE DIRTY WORD
  637. LONG_VAR:    EQU    48    *.L GENERAL SCRATCH VARIABLE
  638. MAX_F_SIZE:    EQU    52    *.L TEMPORY STOARAGE
  639. ******************************************************
  640.  
  641. VARS:    DS.W    100    *A6 VARIABLES